//请求使用
import axios from 'axios'
import VueAxios from 'vue-axios'
import router from '../router'
import Vue from 'vue'
import ElementUI, {Loading} from 'element-ui';

let loading; //定义loading变量

function startLoading() { //使用Element loading-start 方法
    loading = Loading.service({
        lock: true,
        text: '请稍等...',
        background: 'rgba(0, 0, 0, 0.2)'
    })
}

function endLoading() { //使用Element loading-close 方法
    loading.close()
}

let needLoadingRequestCount = 0

export function showFullScreenLoading() {
    if (needLoadingRequestCount === 0) {
        startLoading()
    }
    needLoadingRequestCount++
}

export function tryHideFullScreenLoading() {
    if (needLoadingRequestCount <= 0) return
    needLoadingRequestCount--
    if (needLoadingRequestCount === 0) {
        endLoading()
    }
}

//axios配置和处理
Vue.use(VueAxios, axios);
axios.defaults.baseURL = '/';//项目的的基础url
axios.defaults.headers.common['Authorization'] = '';//请求token信息配置
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';//请求type设置
axios.defaults.timeout = 20000;//在超时前，所有请求都会等待20秒
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    /*if(config.url.startsWith('/flea')){
        config.baseURL = '/farm-plus-file';
        config.timeout = 0;
    }else{
        config.baseURL = '/farm-plus-manager';
    }*/
    // 在发送请求之前处理
    config.headers.common['Authorization'] = localStorage.getItem('Authorization');//判断token在前台session中是否存在
    config.loading && showFullScreenLoading();
    delete config.loading;
    return config;
}, function (error) {
    // 对请求错误做处理
    return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use( (response) =>{
    // 对响应数据处理
    tryHideFullScreenLoading();
    if (response && (response.status == 200)) {
        if (response.data.exceptionMes) {
            ElementUI.MessageBox({
                type: 'info',
                title: response.data.exceptionMes,
                message: response.data.debugMes
            });
        }
        if(response.data.code == 401||response.data.code == 403){

            // if(router.currentRoute.name !== 'Login'){
            //     ElementUI.MessageBox({
            //         type: 'warning',
            //         message: "登录信息失效，请重新登录"
            //     });
            // }
            // window.location.href = window.location.origin+'/changjingyun/loginShow';
            router.replace({
                name: 'Login'
            })
            return response.data;
        }
        if (response.headers["content-type"] == "text/html") {
            window.location.href = response.request.responseURL
        } else {
            return response.data;
        }
    }
    return response;
}, function (error) {
    tryHideFullScreenLoading();
    // 对响应错误处理
    if (!error.response) {
        return '请检查您的网络是否连接';
    }
    if (error.response && error.response.status == 401) {
        // if(router.currentRoute.name !== 'Login'){
        //     ElementUI.MessageBox({
        //         type: 'warning',
        //         message: "登录信息失效，请重新登录"
        //     });
        // }
        router.replace({
            name: 'Login'
        })
    }
    /* if (error.response && error.response.status == 500) {
        return '请检查您的网络是否连接';
    } */
    return Promise.reject(error.response.data);
});
Vue.prototype.$axios = axios;//定义调用方式
Vue.prototype.$yAxios = function(config, cbk, fCbk){
    if(config && !config.method){
        config.method = 'post';
    }
    //请求回到之后需要触发的事件
    if(config.eventsAfterPost && typeof config.eventsAfterPost === 'string'){
        config.eventsAfterPost = config.eventsAfterPost.split(',');
    }
    //是否关闭弹窗，默认关闭
    if(config.closeDialogAfterPost !== false){
        if(!config.eventsAfterPost) config.eventsAfterPost = [];
        config.eventsAfterPost.push('close-dialog');
    }
    try{
        if(config.yLoading){
            this[config.yLoading] = true;
        }
        if(cbk || fCbk){
            return this.$axios(config).then(res => {
                if(res.code == 200 || res.model && res.model.status === 200){
                    cbk && cbk(res.info !== undefined ? res.info : (res.model || res));
                    //请求回到之后需要触发的事件
                    !!config.eventsAfterPost && config.eventsAfterPost.map(event => {
                        Vue.prototype.$bus && Vue.prototype.$bus.$emit(event, true);
                    });
                }else{
                    if(res.code != 401){
                        this.$message({
                            type: 'warning',
                            message: res.msg || "请求失败，请联系管理员"
                        });
                        fCbk && fCbk(res);
                        //请求回到之后需要触发的事件
                        !!config.eventsAfterPost && config.eventsAfterPost.map(event => {
                            Vue.prototype.$bus && Vue.prototype.$bus.$emit(event, true);
                        });
                    }
                }
                if(config.yLoading){
                    this[config.yLoading] = false;
                }
            }).catch(e => {
                if(e.code != 401){
                    this.$message({
                        type: 'warning',
                        message: e.message || "请求失败，请联系管理员"
                    });
                    fCbk && fCbk(e);
                    //请求回到之后需要触发的事件
                    !!config.eventsAfterPost && config.eventsAfterPost.map(event => {
                        Vue.prototype.$bus && Vue.prototype.$bus.$emit(event, true);
                    });
                }
                if(config.yLoading){
                    this[config.yLoading] = false;
                }
            })
        }else{
            return this.$axios(config)
        }
    }catch(e){
        if(e.code != 401){
            this.$message({
                type: 'warning',
                message: e.message || "请求失败，请联系管理员"
            });
            fCbk && fCbk(e);
            //请求回到之后需要触发的事件
            !!config.eventsAfterPost && config.eventsAfterPost.map(event => {
                Vue.prototype.$bus && Vue.prototype.$bus.$emit(event, true);
            });
        }
        if(config.yLoading){
            this[config.yLoading] = false;
        }
    }
}

